package pl.softech.demo2d.physics.fluid.grid;

public class Cell {

	/**
	 * Brzegowa, Pełna, Powierzchniowa, Pusta
	 */
	public enum Flag {
		BOUNDARY, FULL, SURFACE, EMPTY;
	}

	public enum Boundary {
		FREE_SLIP, NO_SLIP
	}

	/**
	 * Składowa prędkość w kierunku wersora (1, 0) o wspołrzędnych (i+1/2, j)
	 */
	public double u;

	/**
	 * Składowa prędkość w kierunku wersora (0, 1) o wspołrzędnych (i, j+1/2)
	 */
	public double v;

	/**
	 * Ciśnienie/gęstość płynu rho o współrzędnych (i, j)
	 */
	public double fi;

	/**
	 * Dywergencja pola wektorowego prędkości o współrzędnych (i, j)
	 */
	public double div;

	/**
	 * Źródło ciśnienia o współrzędnych (i, j)
	 */
	public double z;

	public Flag flag;

	public ISurface surface;

	public Boundary boundary;

	/**
	 * Suma prędkości cząstek w komórce w kierunku wersora (0, 1) i (1, 0)
	 */
	public double un, vn;
	/**
	 * Ilość czątek w komórce
	 */
	public double n;

	private final Cell[][] cells;

	private final int i, j;

	public Cell(Cell[][] cells, int i, int j) {
		this.cells = cells;
		this.i = i;
		this.j = j;
		flag = Flag.EMPTY;
		u = 0;
		v = 0;
	}

	public boolean hasParticles() {
		return n > 0;
	}

	public boolean isAdiacent2Bnd() {
		return (cells[i + 1][j].flag == Flag.BOUNDARY) || (cells[i - 1][j].flag == Flag.BOUNDARY)
				|| (cells[i][j + 1].flag == Flag.BOUNDARY) || (cells[i][j - 1].flag == Flag.BOUNDARY);

	}

	public boolean calculateIsFull() {

		if ((!cells[i + 1][j].hasParticles() && cells[i + 1][j].flag != Flag.BOUNDARY)
				|| (!cells[i - 1][j].hasParticles() && cells[i - 1][j].flag != Flag.BOUNDARY)
				|| (!cells[i][j + 1].hasParticles() && cells[i][j + 1].flag != Flag.BOUNDARY)
				|| (!cells[i][j - 1].hasParticles() && cells[i][j - 1].flag != Flag.BOUNDARY)) {

			return false;
		}
		
		return true;

	}

	@Override
	public String toString() {
		return "Cell [u=" + u + ", v=" + v + ", fi=" + fi + ", div=" + div + ", z=" + z + ", flag=" + flag
				+ ", surface=" + surface + ", boundary=" + boundary + ", un=" + un + ", vn=" + vn + ", n=" + n
				+ ", hasParticles()=" + hasParticles() + "]";
	}

}
